#include "log_in.h"
/*
用户名 log_in
参数
    name  用户
    my_pos   密码
返回值
    无
功能
    实现登陆功能
        用户通过输入 账号密码 本函数进行判断
        如果3次错误 则等待 5 s 然后重新输入
        直到输入正确 然后退出
*/
void log_in(char (*name)[128], char *my_pos)
{
    system("clear");
    char in_name[128] = " "; // 用户输入的账号
    char in_pos[128] = " ";  // 用户输入的密码

    int flag_1 = 0;
    int num = 0; // 用于记录输入错误的次数
    /*
    flag_1 = -98  账号正确
    flag_1 = -99  账号错误
    */
    while (1)
    {

        puts("欢迎来到此登录系统，请输入你的账号(输错三次有惊喜)");
        scanf("%s", in_name);
        for (size_t i = 0; i < 10; i++)
        {
            if (!strcmp(in_name, name[i]))
            {
                puts("账号正确");
                flag_1 = -98; // 账号正确
                break;
            }
            if (i == 9) // 这里有bug
            {
                puts("账号错误");
                flag_1 = -99; // 账号错误
                num++;        // 记录用户输入错误的次数
            }
        }

        if (flag_1 == -98)
        {
            puts("请输入你的密码");
            scanf("%s", in_pos);
            if (!strcmp(in_pos, my_pos))
            {
                printf("既见朕，为何不跪\n");
                menu();
                return;
            }
            else
            {
                puts("密码错误");
                num++;
            }
        }

        if (num == 3)
        {
            num = 0;                // 错误次数请0
            Progress_Bar(0, 0, 10); // 打印进度条
        }
    }
}

/*
用户名 Progress_yBar
参数
    @x              想要显示的位置 x
    @y              想要显示的位置 y
    @time_length    想要延时的时间
返回值
    无
功能
    进度条功能
*/
void Progress_Bar(int x, int y, float time_length)
{
    float flag = 0;                          // 当前进度时间
    float total_length = 20;                 // 进度条总长度
    float mean = time_length / total_length; // 平均数
    float temp = 0;                          // 和平均数对比
    float percent = 0;                       // 用于显示百分比
    int num = 0;                             // 控制进度条符号的个数

    while (1)
    {

        if (fabs(temp - mean) < EPSILON) // 使用fabs计算浮点数差值的绝对值fabs 函数的原型如下：double fabs(double x);
        {
            num++;
            temp = 0;
        }
        for (size_t i = 0; i < y; i++)
        {
            putchar('\n');
        }
        for (size_t i = 0; i < x; i++)
        {
            putchar(' ');
        }

        putchar('[');
        for (size_t i = 0; i < num; i++)
        {
            printf(">");
        }
        for (size_t i = 0; i < total_length - num; i++)
        {
            printf(" ");
        }
        putchar(']');
        percent = ((time_length / 100) * flag) * 100;
        printf("%.2f%%\n", percent);
        temp += 0.01;
        flag += 0.01;
        if (fabs((flag - 0.01) - time_length) < EPSILON)
        {
            break;
        }

        // 监控数据

        // printf("\n%.2f", flag);
        // printf("\n%.2f", time_length);
        // printf("\n%.2f", temp);
        // printf("\n%.2f", mean);
        // printf("\n%d", num);

        fflush(stdout);
        usleep(10000);
        system("clear");
    }
    system("clear");
}

void menu()
{
    int i;
    puts("******************************************");
    puts("********     1.猜数字小游戏      *********");
    puts("********     2.可控金字塔        *********");
    puts("********     3.随机生成学生成绩  *********");
    puts("********     4.退出              *********");
    puts("******************************************");
    puts("请输入你的选择：");
    scanf("%d", &i);
    switch (i)
    {
    case 1:
        Guess_Number();
        menu();
        break;
    case 2:
        pyramids();
        menu();
        break;
    case 3:
        Random_Grade();
        menu();
        break;
    case 4:
        break;
    default:
        puts("没有此选项");
    }
}

/* void Guess_Number()
{
    int randomNumber, guess, numberOfTries = 0;
    srand(time(NULL));
    randomNumber = rand() % 100 + 1;

    printf("欢迎来到猜数字游戏!\n");
    printf("选一个1到100之间的数字\n");

    while (guess != randomNumber)
    {
        printf("请输入你猜的数字: ");
        scanf("%d", &guess);
        numberOfTries++;

        if (guess > randomNumber)
        {
            printf("大了，请重新尝试\n");
        }
        else if (guess < randomNumber)
        {
            printf("小了，请重新尝试.\n");
        }
        else
        {
            printf("恭喜你猜对了! 一共尝试了%d次\n", numberOfTries);
        }
    }
} */
void Guess_Number()
{
    int randomNumber;
    double guess;
    int numberOfTries = 0;

    srand(time(NULL));
    randomNumber = rand() % 100 + 1;

    printf("欢迎来到猜数字游戏!\n");
    printf("选一个1到100之间的数字\n");

    while (1)
    {
        printf("请输入你猜的数字: ");
        if (scanf("%lf", &guess) != 1) {
            printf("无效输入，请输入一个数字。\n");
            // 清除输入缓冲区
            while (getchar() != '\n');
            continue;
        }
        numberOfTries++;

        int roundedGuess = (int)round(guess);

        if (roundedGuess > randomNumber)
        {
            printf("大了，请重新尝试\n");
        }
        else if (roundedGuess < randomNumber)
        {
            printf("小了，请重新尝试.\n");
        }
        else
        {
            printf("恭喜你猜对了! 一共尝试了%d次\n", numberOfTries);
            break;
        }
    }
}

void pyramids()
{
    int i, j, n, u = 1;
    while (u)
    {
        printf("请输入一个层数,输入0退出:");
        if (scanf("%d", &n) == 1)
        {
            if (n > 0)
            {
                u = 1;
            }
            else
            {
                printf("输入正值\n");
                continue;
            }
        }
        else
        {
            printf("输入合适的值.\n");
            // 清除输入缓冲区
            while (getchar() != '\n')
                ;
            continue;
        }

        if (n != 0)
        {
            for (i = 1; i <= n; i++)
            {
                for (j = 1; j <= n - i; j++)
                {
                    printf(" ");
                }
                for (j = 1; j <= 2 * i - 1; j++)
                {
                    printf("*");
                }
                printf("\n");
            }
        }
        else
        {
            break;
        }
    }
}

void Random_Grade()
{
    char USER_DATA[11][10] =
        {
            "张三",
            "李四",
            "王五",
            "赵六",
            "孙七",
            "周八",
            "吴九",
            "郑十",
            "陈十一",
            "杨十二",
            "钱十三",
        };
    int arr[11];
    int temp = 0;
    srand(time(NULL)); // 使用当前时间作为随机种子

    for (size_t i = 0; i < sizeof(arr) / sizeof(int); i++)
    {
        arr[i] = rand() % 100 + 1;
    }

    // 冒泡排序算法
    for (size_t i = 0; i < sizeof(arr) / sizeof(int) - 1; i++)
    {
        for (size_t j = 0; j < sizeof(arr) / sizeof(int); j++)
        {
            if (arr[j] > arr[j + 1])
            {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }

    for (size_t i = 0; i < sizeof(arr) / sizeof(int); i++)
    {
        printf("arr[%ld] =  %s 分数为: %d   ", i, USER_DATA[0] + 10 * i, arr[i]);
        if (arr[i] >= 90)
            printf("优秀\n");
        else if (arr[i] >= 80)
            printf("良好\n");
        else if (arr[i] >= 70)
            printf("中等\n");
        else if (arr[i] >= 60)
            printf("及格\n");
        else
            printf("不及格\n");
    }
}

/* void Bublle_Sort(int arr[],int n)
{
    int temp = 0;
      for (size_t i = 0; i < n - 1; i++)
    {
        for (size_t j = 0; j < n-i-1; j++)
        {
            if (arr[j] > arr[j+1])
            {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }

    for (size_t i = 0; i < n; i++)
    {
        printf("arr[%ld] = [%d]\n" , i , arr[i]);
    }
} */
